package utils

import (
	"encoding/json"
	"gitee.com/changzer/zink/zink/ziface"
	"io/ioutil"
)

/*
	存储一切有关zink框架的全局参数，供其他模块使用
	一些参数也可以通过用户根据zink.json来配置
*/

type GlobalObj struct {
	/*
		Server
	*/
	TcpServer ziface.IServer // 当前zink全局的Server对象
	Host      string         // 当前zink全局的Server对象的监听IP
	TcpPort   int            // 当前zink全局的Server对象的监听端口号
	Name      string         // 当前zink全局的Server对象的名称

	/*
		Zinx
	*/
	Version        string // 当前zink全局的Server对象的版本号
	MaxConn        int    // 当前zink全局的Server对象的允许的最大连接数
	MaxPackageSize uint32 // 当前zink全局的Server对象的数据包的最大值

	/*
		Worker
	*/
	WorkerPoolSize   uint32 // 当前zink全局的Server对象的worker工作池的goroutine数量
	MaxWorkerTaskLen uint32 // 每个worker对应的消息队列的任务的数量最大值

}

/*
定义一个全局的对外GlobalObj
*/
var GlobalObject *GlobalObj

/*
	提供一个init方法，初始化当前的GlobalObject
*/

func (g *GlobalObj) Reload() {
	file, err := ioutil.ReadFile("conf/zink.json")
	if err != nil {
		panic(err)
	}
	// 将json文件解析到struct中
	err = json.Unmarshal(file, &GlobalObject)
	if err != nil {
		panic(err)
	}
}

func init() {
	// 如果配置文件没有加载，默认的值
	GlobalObject = &GlobalObj{
		Name:             "ZinxServerApp",
		Version:          "V0.8",
		TcpPort:          8999,
		Host:             "0.0.0.0",
		MaxConn:          1000,
		MaxPackageSize:   4096,
		WorkerPoolSize:   10,
		MaxWorkerTaskLen: 1024,
	}

	// 从配置文件中加载一些用户配置的参数
	GlobalObject.Reload()
}
